class Solution {
    /*
        思路1：
            dfs遍历，当左右儿子均为null时即为叶子节点，此时输出序列即可
        坑点：
            1.List<Integer>.remove(new Integer(value))  注意remove方法有两个重载方法
            2.由于树的节点的值可能是重复的，所以不能不能使用remove（value）的办法
        代码简化：
            路径和为targetSum，可以反过来，用targetSum不断减去路径，
            到达叶子节点的时候，如果targetSum的值为0，即
    */
    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        dfs(root,targetSum);
        return ans;
    }
    public void dfs(TreeNode root,int sum){
        if(root == null){ 
            return;
        }
        sum -= root.val;
        list.add(root.val);
        // 到达叶子节点
        if(root.left==null && root.right==null && sum==0){
            ans.add(new ArrayList<>(list));
        }
        dfs(root.left,sum);
        dfs(root.right,sum);
        list.remove(list.size()-1);
    }
}